<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>Most Fields | Elasticsearch: The Definitive Guide [2.x] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch: The Definitive Guide [2.x]">
<link rel="up" href="multi-field-search.html" title="Multifield Search">
<link rel="prev" href="multi-match-query.html" title="multi_match Query">
<link rel="next" href="_cross_fields_entity_search.html" title="Cross-fields Entity Search">
<meta name="DC.type" content="Learn/Docs/Legacy/Elasticsearch/Definitive Guide/2.x">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="2.x">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<p>
  <strong>WARNING</strong>: The 2.x versions of Elasticsearch have passed their
  <a href="https://www.elastic.co/support/eol">EOL dates</a>. If you are running
  a 2.x version, we strongly advise you to upgrade.
</p>
<p>
  This documentation is no longer maintained and may be removed. For the latest
  information, see the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html">current
  Elasticsearch documentation</a>.
</p>
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: The Definitive Guide [2.x]</a></span>
»
<span class="breadcrumb-link"><a href="search-in-depth.html">Search in Depth</a></span>
»
<span class="breadcrumb-link"><a href="multi-field-search.html">Multifield Search</a></span>
»
<span class="breadcrumb-node">Most Fields</span>
</div>
<div class="navheader">
<span class="prev">
<a href="multi-match-query.html">« multi_match Query</a>
</span>
<span class="next">
<a href="_cross_fields_entity_search.html">Cross-fields Entity Search »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="most-fields"></a>Most Fields<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/110_Multi_Field_Search/30_Most_fields.asciidoc">edit</a>
</h2>
</div></div></div>
<p>Full-text search is a battle between <em>recall</em>—returning all the
documents that are relevant—​and <em>precision</em>—not returning irrelevant
documents.  The goal is to present the user with the most relevant documents
on the first page of results.</p>
<p>To improve recall, we cast the net wide—​we include not only
documents that match the user’s search terms exactly, but also
documents that we believe to be pertinent to the query.  If a user searches
for “quick brown fox,” a document that contains <code class="literal">fast foxes</code> may well be
a reasonable result to return.</p>
<p>If the only pertinent document that we have is the one containing <code class="literal">fast
foxes</code>, it will appear at the top of the results list.  But of course, if
we have 100 documents that contain the words <code class="literal">quick brown fox</code>, then the
<code class="literal">fast foxes</code> document may be considered less relevant, and we would want to
push it further down the list.  After including many potential matches, we
need to ensure that the best ones rise to the top.</p>
<p>A common technique for fine-tuning full-text relevance is to index the same
text in multiple ways, each of which provides a different relevance <em>signal</em>. The main field would contain terms in their broadest-matching form to match as
many documents as possible.  For instance, we could do the following:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
Use a stemmer to index <code class="literal">jumps</code>, <code class="literal">jumping</code>, and <code class="literal">jumped</code> as their root
form: <code class="literal">jump</code>.  Then it doesn’t matter if the user searches for
<code class="literal">jumped</code>; we could still match documents containing <code class="literal">jumping</code>.
</li>
<li class="listitem">
Include synonyms like <code class="literal">jump</code>, <code class="literal">leap</code>, and <code class="literal">hop</code>.
</li>
<li class="listitem">
Remove diacritics, or accents: for example, <code class="literal">ésta</code>, <code class="literal">está</code>, and <code class="literal">esta</code> would
all be indexed without accents as <code class="literal">esta</code>.
</li>
</ul>
</div>
<p>However, if we have two documents, one of which contains <code class="literal">jumped</code> and the
other <code class="literal">jumping</code>, the user would probably expect the first document to rank
higher, as it contains exactly what was typed in.</p>
<p>We can achieve this by indexing the same text in other fields to provide more-precise matching.  One field may contain the unstemmed version, another the
original word with diacritics, and a third might use <em>shingles</em> to provide
information about <a class="xref" href="proximity-matching.html" title="Proximity Matching">word proximity</a>. These other fields
act as <em>signals</em> that increase the relevance score of each matching document.
The more fields that match, the better.</p>
<p>A document is included in the results list if it matches the broad-matching
main field. If it also matches the <em>signal</em> fields, it gets extra
points and is pushed up the results list.</p>
<p>We discuss synonyms, word proximity, partial-matching and other potential
signals later in the book, but we will use the simple example of stemmed and
unstemmed fields to illustrate this technique.</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_multifield_mapping"></a>Multifield Mapping<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/110_Multi_Field_Search/30_Most_fields.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The first thing to do is to set up our field to be indexed twice: once in a
stemmed form and once in an unstemmed form.  To do this, we will use
<em>multifields</em>, which we introduced in <a class="xref" href="multi-fields.html" title="String Sorting and Multifields">String Sorting and Multifields</a>:</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">DELETE /my_index

PUT /my_index
{
    "settings": { "number_of_shards": 1 }, <a id="CO71-1"></a><i class="conum" data-value="1"></i>
    "mappings": {
        "my_type": {
            "properties": {
                "title": { <a id="CO71-2"></a><i class="conum" data-value="2"></i>
                    "type":     "string",
                    "analyzer": "english",
                    "fields": {
                        "std":   { <a id="CO71-3"></a><i class="conum" data-value="3"></i>
                            "type":     "string",
                            "analyzer": "standard"
                        }
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/110_Multi_Field_Search/30_Most_fields.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO71-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>See <a class="xref" href="relevance-is-broken.html" title="Relevance Is Broken!">Relevance Is Broken!</a>.</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO71-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>The <code class="literal">title</code> field is stemmed by the <code class="literal">english</code> analyzer.</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO71-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>The <code class="literal">title.std</code> field uses the <code class="literal">standard</code> analyzer and so is not stemmed.</p>
</td>
</tr>
</table>
</div>
<p>Next we index some documents:</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">PUT /my_index/my_type/1
{ "title": "My rabbit jumps" }

PUT /my_index/my_type/2
{ "title": "Jumping jack rabbits" }</pre>
</div>
<div class="sense_widget" data-snippet="snippets/110_Multi_Field_Search/30_Most_fields.json"></div>
<p>Here is a simple <code class="literal">match</code> query on the <code class="literal">title</code> field for <code class="literal">jumping rabbits</code>:</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /my_index/_search
{
   "query": {
        "match": {
            "title": "jumping rabbits"
        }
    }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/110_Multi_Field_Search/30_Most_fields.json"></div>
<p>This becomes a query for the two stemmed terms <code class="literal">jump</code> and <code class="literal">rabbit</code>, thanks to the
<code class="literal">english</code> analyzer. The <code class="literal">title</code> field of both documents contains both of those
terms, so both documents receive the same score:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
  "hits": [
     {
        "_id": "1",
        "_score": 0.42039964,
        "_source": {
           "title": "My rabbit jumps"
        }
     },
     {
        "_id": "2",
        "_score": 0.42039964,
        "_source": {
           "title": "Jumping jack rabbits"
        }
     }
  ]
}</pre>
</div>
<p>If we were to query just the <code class="literal">title.std</code> field, then only document 2 would
match.  However, if we were to query both fields and to <em>combine</em> their scores
by using the <code class="literal">bool</code> query, then both documents would match (thanks to the <code class="literal">title</code>
field) and document 2 would score higher (thanks to the <code class="literal">title.std</code> field):</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /my_index/_search
{
   "query": {
        "multi_match": {
            "query":  "jumping rabbits",
            "type":   "most_fields", <a id="CO72-1"></a><i class="conum" data-value="1"></i>
            "fields": [ "title", "title.std" ]
        }
    }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/110_Multi_Field_Search/30_Most_fields.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO72-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>We want to combine the scores from all matching fields, so we use the
<code class="literal">most_fields</code> type.  This causes the <code class="literal">multi_match</code> query to wrap the two
field-clauses in a <code class="literal">bool</code> query instead of a <code class="literal">dis_max</code> query.</p>
</td>
</tr>
</table>
</div>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
  "hits": [
     {
        "_id": "2",
        "_score": 0.8226396, <a id="CO73-1"></a><i class="conum" data-value="1"></i>
        "_source": {
           "title": "Jumping jack rabbits"
        }
     },
     {
        "_id": "1",
        "_score": 0.10741998, <a id="CO73-2"></a><i class="conum" data-value="1"></i>
        "_source": {
           "title": "My rabbit jumps"
        }
     }
  ]
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO73-1"><i class="conum" data-value="1"></i></a><a href="#CO73-2"></a></p>
</td>
<td align="left" valign="top">
<p>Document 2 now scores much higher than document 1.</p>
</td>
</tr>
</table>
</div>
<p>We are using the broad-matching <code class="literal">title</code> field to include as many documents as
possible—​to increase recall—​but we use the <code class="literal">title.std</code> field as a
<em>signal</em> to push the most relevant results to the top.</p>
<p>The contribution of each field to the final score can be controlled by
specifying custom <code class="literal">boost</code> values. For instance, we could boost the <code class="literal">title</code>
field to make it the most important field, thus reducing the effect of any
other signal fields:</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /my_index/_search
{
   "query": {
        "multi_match": {
            "query":       "jumping rabbits",
            "type":        "most_fields",
            "fields":      [ "title^10", "title.std" ] <a id="CO74-1"></a><i class="conum" data-value="1"></i>
        }
    }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/110_Multi_Field_Search/30_Most_fields.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO74-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The <code class="literal">boost</code> value of <code class="literal">10</code> on the <code class="literal">title</code> field makes that field relatively
much more important than the <code class="literal">title.std</code> field.</p>
</td>
</tr>
</table>
</div>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="multi-match-query.html">« multi_match Query</a>
</span>
<span class="next">
<a href="_cross_fields_entity_search.html">Cross-fields Entity Search »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
